Computer systems employ a number of techniques for detecting errors that may have been introduced into data during transmission across a network. Commonly, a checksum is calculated over the header and/or body of a packet or frame and is transmitted with the packet or frame. The checksum is a compact representation of the data within the packet or frame. At the receiving end, the same calculation is performed across the header and/or body of the packet or frame and the checksum calculated on the received data is compared with the transmitted checksum. If the calculated checksum matches the received checksum, the data is deemed to be valid. If the received checksum doesn't match the calculated checksum, the data is deemed to have been corrupted.
One of the techniques commonly employed to calculate checksums for use in networking protocols is called Cyclic Redundancy Check (CRC). The CRC is calculated by treating the binary representation of the data across which the CRC is calculated as the coefficients of a polynomial. This polynomial is then divided by a predetermined polynomial of a given size using modulo 2 polynomial arithmetic. The checksum (also referred to as the “residue”) is the remainder resulting from this operation.
Specific CRCs are characterized by the size and coefficients of the polynomial that is used as the divisor. A variety of different CRC polynomials of different lengths have been defined. Different networking protocols use a multitude of different CRCs ranging from 5 bits to 32 bits in length. For example, the Ethernet protocol uses a 32-bit CRC polynomial and its CRC is therefore referred to as CRC-32.
Prior art CRC calculation engines typically implement fixed function acceleration units for calculating each specific CRC (for each specific polynomial). For example, a network processor may contain fixed function blocks for five such polynomials, but this still does not cover all of the networking protocols that can be implemented on a network processor. Adding fixed function CRC engines for all of the CRCs used by all of the protocols which might be processed by a network processor may not be a viable option since this approach would be very costly from a die area perspective, for example. As a result, most network processors are aimed at specific networking segments and contain fixed function acceleration hardware for the specific CRCs used by the protocols associated with that networking segment.